package tests;
//originally from : joins.C

import iterator.*;
import heap.*;
import global.*;
import index.*;
import java.io.*;
import java.util.*;
import java.lang.*;
import diskmgr.*;
import bufmgr.*;
import btree.*; 
import catalog.*;

/**
   Here is the implementation for the tests. There are N tests performed.
   We start off by showing that each operator works on its own.
   Then more complicated trees are constructed.
   As a nice feature, we allow the user to specify a selection condition.
   We also allow the user to hardwire trees together.
 */

class JoinsDriver implements GlobalConst {

	private boolean OK = true;
	private boolean FAIL = false;
	private Vector sailors;
	private Vector boats;
	private Vector reserves;
	/** Constructor
	 */
	public JoinsDriver() {

		//build Sailor, Boats, Reserves table
		sailors  = new Vector();
		boats    = new Vector();
		reserves = new Vector();

		sailors.addElement(new Sailor(53, "Bob Holloway",       9, 53.6));
		sailors.addElement(new Sailor(54, "Susan Horowitz",     1, 34.2));
		sailors.addElement(new Sailor(57, "Yannis Ioannidis",   8, 40.2));
		sailors.addElement(new Sailor(59, "Deborah Joseph",    10, 39.8));
		sailors.addElement(new Sailor(61, "Landwebber",         8, 56.7));
		sailors.addElement(new Sailor(63, "James Larus",        9, 30.3));
		sailors.addElement(new Sailor(64, "Barton Miller",      5, 43.7));
		sailors.addElement(new Sailor(67, "David Parter",       1, 99.9));   
		sailors.addElement(new Sailor(69, "Raghu Ramakrishnan", 9, 37.1));
		sailors.addElement(new Sailor(71, "Guri Sohi",         10, 42.1));
		sailors.addElement(new Sailor(73, "Prasoon Tiwari",     8, 39.2));
		sailors.addElement(new Sailor(39, "Anne Condon",        3, 30.3));
		sailors.addElement(new Sailor(47, "Charles Fischer",    6, 46.3));
		sailors.addElement(new Sailor(49, "James Goodman",      4, 50.3));
		sailors.addElement(new Sailor(50, "Mark Hill",          5, 35.2));
		sailors.addElement(new Sailor(75, "Mary Vernon",        7, 43.1));
		sailors.addElement(new Sailor(79, "David Wood",         3, 39.2));
		sailors.addElement(new Sailor(84, "Mark Smucker",       9, 25.3));
		sailors.addElement(new Sailor(87, "Martin Reames",     10, 24.1));
		sailors.addElement(new Sailor(10, "Mike Carey",         9, 40.3));
		sailors.addElement(new Sailor(21, "David Dewitt",      10, 47.2));
		sailors.addElement(new Sailor(29, "Tom Reps",           7, 39.1));
		sailors.addElement(new Sailor(31, "Jeff Naughton",      5, 35.0));
		sailors.addElement(new Sailor(35, "Miron Livny",        7, 37.6));
		sailors.addElement(new Sailor(37, "Marv Solomon",      10, 48.9));

		boats.addElement(new Boats(1, "Onion",      "white"));
		boats.addElement(new Boats(2, "Buckey",     "red"  ));
		boats.addElement(new Boats(3, "Enterprise", "blue" ));
		boats.addElement(new Boats(4, "Voyager",    "green"));
		boats.addElement(new Boats(5, "Wisconsin",  "red"  ));

		reserves.addElement(new Reserves(10, 1, "05/10/95"));
		reserves.addElement(new Reserves(21, 1, "05/11/95"));
		reserves.addElement(new Reserves(10, 2, "05/11/95"));
		reserves.addElement(new Reserves(31, 1, "05/12/95"));
		reserves.addElement(new Reserves(10, 3, "05/13/95"));
		reserves.addElement(new Reserves(69, 4, "05/12/95"));
		reserves.addElement(new Reserves(69, 5, "05/14/95"));
		reserves.addElement(new Reserves(21, 5, "05/16/95"));
		reserves.addElement(new Reserves(57, 2, "05/10/95"));
		reserves.addElement(new Reserves(35, 3, "05/15/95"));

		boolean status = OK;
		int numsailors = 25;
		int numsailors_attrs = 4;
		int numreserves = 10;
		int numreserves_attrs = 3;
		int numboats = 5;
		int numboats_attrs = 3;

		String dbpath = "/tmp/"+System.getProperty("user.name")+".minibase.jointestdb"; 
		String logpath = "/tmp/"+System.getProperty("user.name")+".joinlog";

		String remove_cmd = "/bin/rm -rf ";
		String remove_logcmd = remove_cmd + logpath;
		String remove_dbcmd = remove_cmd + dbpath;
		String remove_joincmd = remove_cmd + dbpath;

		try {
			Runtime.getRuntime().exec(remove_logcmd);
			Runtime.getRuntime().exec(remove_dbcmd);
			Runtime.getRuntime().exec(remove_joincmd);
		}
		catch (IOException e) {
			System.err.println (""+e);
		}


		/*
    ExtendedSystemDefs extSysDef = 
      new ExtendedSystemDefs( "/tmp/minibase.jointestdb", "/tmp/joinlog",
			      1000,500,200,"Clock");
		 */

		SystemDefs sysdef = new SystemDefs( dbpath, 1000, NUMBUF, "Clock" );

		// creating the sailors relation
		AttrType [] Stypes = new AttrType[4];
		Stypes[0] = new AttrType (AttrType.attrInteger);
		Stypes[1] = new AttrType (AttrType.attrString);
		Stypes[2] = new AttrType (AttrType.attrInteger);
		Stypes[3] = new AttrType (AttrType.attrReal);

		//SOS
		short [] Ssizes = new short [1];
		Ssizes[0] = 30; //first elt. is 30

		Tuple t = new Tuple();
		try {
			t.setHdr((short) 4,Stypes, Ssizes);
		}
		catch (Exception e) {
			System.err.println("*** error in Tuple.setHdr() ***");
			status = FAIL;
			e.printStackTrace();
		}

		int size = t.size();

		// inserting the tuple into file "sailors"
		RID             rid;
		Heapfile        f = null;
		try {
			f = new Heapfile("sailors.in");
		}
		catch (Exception e) {
			System.err.println("*** error in Heapfile constructor ***");
			status = FAIL;
			e.printStackTrace();
		}

		t = new Tuple(size);
		try {
			t.setHdr((short) 4, Stypes, Ssizes);
		}
		catch (Exception e) {
			System.err.println("*** error in Tuple.setHdr() ***");
			status = FAIL;
			e.printStackTrace();
		}

		for (int i=0; i<numsailors; i++) {
			try {
				t.setIntFld(1, ((Sailor)sailors.elementAt(i)).sid);
				t.setStrFld(2, ((Sailor)sailors.elementAt(i)).sname);
				t.setIntFld(3, ((Sailor)sailors.elementAt(i)).rating);
				t.setFloFld(4, (float)((Sailor)sailors.elementAt(i)).age);
			}
			catch (Exception e) {
				System.err.println("*** Heapfile error in Tuple.setStrFld() ***");
				status = FAIL;
				e.printStackTrace();
			}

			try {
				rid = f.insertRecord(t.returnTupleByteArray());
			}
			catch (Exception e) {
				System.err.println("*** error in Heapfile.insertRecord() ***");
				status = FAIL;
				e.printStackTrace();
			}      
		}
		if (status != OK) {
			//bail out
			System.err.println ("*** Error creating relation for sailors");
			Runtime.getRuntime().exit(1);
		}

		//creating the boats relation
		AttrType [] Btypes = {
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrString), 
				new AttrType(AttrType.attrString), 
		};

		short  []  Bsizes = new short[2];
		Bsizes[0] = 30;
		Bsizes[1] = 20;
		t = new Tuple();
		try {
			t.setHdr((short) 3,Btypes, Bsizes);
		}
		catch (Exception e) {
			System.err.println("*** error in Tuple.setHdr() ***");
			status = FAIL;
			e.printStackTrace();
		}

		size = t.size();

		// inserting the tuple into file "boats"
		//RID             rid;
		f = null;
		try {
			f = new Heapfile("boats.in");
		}
		catch (Exception e) {
			System.err.println("*** error in Heapfile constructor ***");
			status = FAIL;
			e.printStackTrace();
		}

		t = new Tuple(size);
		try {
			t.setHdr((short) 3, Btypes, Bsizes);
		}
		catch (Exception e) {
			System.err.println("*** error in Tuple.setHdr() ***");
			status = FAIL;
			e.printStackTrace();
		}

		for (int i=0; i<numboats; i++) {
			try {
				t.setIntFld(1, ((Boats)boats.elementAt(i)).bid);
				t.setStrFld(2, ((Boats)boats.elementAt(i)).bname);
				t.setStrFld(3, ((Boats)boats.elementAt(i)).color);
			}
			catch (Exception e) {
				System.err.println("*** error in Tuple.setStrFld() ***");
				status = FAIL;
				e.printStackTrace();
			}

			try {
				rid = f.insertRecord(t.returnTupleByteArray());
			}
			catch (Exception e) {
				System.err.println("*** error in Heapfile.insertRecord() ***");
				status = FAIL;
				e.printStackTrace();
			}      
		}
		if (status != OK) {
			//bail out
			System.err.println ("*** Error creating relation for boats");
			Runtime.getRuntime().exit(1);
		}

		//creating the boats relation
		AttrType [] Rtypes = new AttrType[3];
		Rtypes[0] = new AttrType (AttrType.attrInteger);
		Rtypes[1] = new AttrType (AttrType.attrInteger);
		Rtypes[2] = new AttrType (AttrType.attrString);

		short [] Rsizes = new short [1];
		Rsizes[0] = 15; 
		t = new Tuple();
		try {
			t.setHdr((short) 3,Rtypes, Rsizes);
		}
		catch (Exception e) {
			System.err.println("*** error in Tuple.setHdr() ***");
			status = FAIL;
			e.printStackTrace();
		}

		size = t.size();

		// inserting the tuple into file "boats"
		//RID             rid;
		f = null;
		try {
			f = new Heapfile("reserves.in");
		}
		catch (Exception e) {
			System.err.println("*** error in Heapfile constructor ***");
			status = FAIL;
			e.printStackTrace();
		}

		t = new Tuple(size);
		try {
			t.setHdr((short) 3, Rtypes, Rsizes);
		}
		catch (Exception e) {
			System.err.println("*** error in Tuple.setHdr() ***");
			status = FAIL;
			e.printStackTrace();
		}

		for (int i=0; i<numreserves; i++) {
			try {
				t.setIntFld(1, ((Reserves)reserves.elementAt(i)).sid);
				t.setIntFld(2, ((Reserves)reserves.elementAt(i)).bid);
				t.setStrFld(3, ((Reserves)reserves.elementAt(i)).date);

			}
			catch (Exception e) {
				System.err.println("*** error in Tuple.setStrFld() ***");
				status = FAIL;
				e.printStackTrace();
			}      

			try {
				rid = f.insertRecord(t.returnTupleByteArray());
			}
			catch (Exception e) {
				System.err.println("*** error in Heapfile.insertRecord() ***");
				status = FAIL;
				e.printStackTrace();
			}      
		}
		if (status != OK) {
			//bail out
			System.err.println ("*** Error creating relation for reserves");
			Runtime.getRuntime().exit(1);
		}

	}

	public boolean runTests() {

		Disclaimer();
		Query1();

		Query2();
		Query3();


		Query4();
		Query5();
		Query6();


		System.out.print ("Finished joins testing"+"\n");


		return true;
	}

	private void Query1_CondExpr(CondExpr[] expr) {

		expr[0].next  = null;
		expr[0].op    = new AttrOperator(AttrOperator.aopEQ);
		expr[0].type1 = new AttrType(AttrType.attrSymbol);
		expr[0].type2 = new AttrType(AttrType.attrSymbol);
		expr[0].operand1.symbol = new FldSpec (new RelSpec(RelSpec.outer),1);
		expr[0].operand2.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),1);

		expr[1].op    = new AttrOperator(AttrOperator.aopEQ);
		expr[1].next  = null;
		expr[1].type1 = new AttrType(AttrType.attrSymbol);
		expr[1].type2 = new AttrType(AttrType.attrInteger);
		expr[1].operand1.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),2);
		expr[1].operand2.integer = 1;

		expr[2] = null;
	}

	private void Query2_CondExpr(CondExpr[] expr, CondExpr[] expr2) {

		expr[0].next  = null;
		expr[0].op    = new AttrOperator(AttrOperator.aopEQ);
		expr[0].type1 = new AttrType(AttrType.attrSymbol);
		expr[0].type2 = new AttrType(AttrType.attrSymbol);
		expr[0].operand1.symbol = new FldSpec (new RelSpec(RelSpec.outer),1);
		expr[0].operand2.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),1);

		expr[1] = null;

		expr2[0].next  = null;
		expr2[0].op    = new AttrOperator(AttrOperator.aopEQ); 
		expr2[0].type1 = new AttrType(AttrType.attrSymbol);
		expr2[0].type2 = new AttrType(AttrType.attrSymbol);   
		expr2[0].operand1.symbol = new FldSpec (new RelSpec(RelSpec.outer),2);
		expr2[0].operand2.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),1);

		expr2[1].op   = new AttrOperator(AttrOperator.aopEQ);
		expr2[1].next = null;
		expr2[1].type1 = new AttrType(AttrType.attrSymbol);
		expr2[1].type2 = new AttrType(AttrType.attrString);
		expr2[1].operand1.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),3);
		expr2[1].operand2.string = "red";

		expr2[2] = null;
	}

	private void Query3_CondExpr(CondExpr[] expr) {

		expr[0].next  = null;
		expr[0].op    = new AttrOperator(AttrOperator.aopEQ);
		expr[0].type1 = new AttrType(AttrType.attrSymbol);
		expr[0].operand1.symbol = new FldSpec (new RelSpec(RelSpec.outer),1);
		expr[0].type2 = new AttrType(AttrType.attrSymbol);
		expr[0].operand2.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),1);
		expr[1] = null;
	}

	private CondExpr[] Query5_CondExpr() {
		CondExpr [] expr2 = new CondExpr[3];
		expr2[0] = new CondExpr();


		expr2[0].next  = null;
		expr2[0].op    = new AttrOperator(AttrOperator.aopEQ);
		expr2[0].type1 = new AttrType(AttrType.attrSymbol);

		expr2[0].operand1.symbol = new FldSpec(new RelSpec(RelSpec.outer),1);
		expr2[0].type2 = new AttrType(AttrType.attrSymbol);

		expr2[0].operand2.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),1);

		expr2[1] = new CondExpr();
		expr2[1].op   = new AttrOperator(AttrOperator.aopGT);
		expr2[1].next = null;
		expr2[1].type1 = new AttrType(AttrType.attrSymbol);

		expr2[1].operand1.symbol = new FldSpec (new RelSpec(RelSpec.outer),4);
		expr2[1].type2 = new AttrType(AttrType.attrReal);
		expr2[1].operand2.real = (float)40.0;


		expr2[1].next = new CondExpr();
		expr2[1].next.op   = new AttrOperator(AttrOperator.aopLT);
		expr2[1].next.next = null;
		expr2[1].next.type1 = new AttrType(AttrType.attrSymbol); // rating
		expr2[1].next.operand1.symbol = new FldSpec ( new RelSpec(RelSpec.outer),3);
		expr2[1].next.type2 = new AttrType(AttrType.attrInteger);
		expr2[1].next.operand2.integer = 7;

		expr2[2] = null;
		return expr2;
	}

	private void Query6_CondExpr(CondExpr[] expr, CondExpr[] expr2) {

		expr[0].next  = null;
		expr[0].op    = new AttrOperator(AttrOperator.aopEQ);
		expr[0].type1 = new AttrType(AttrType.attrSymbol);

		expr[0].operand1.symbol = new FldSpec (new RelSpec(RelSpec.outer),1);
		expr[0].type2 = new AttrType(AttrType.attrSymbol);

		expr[0].operand2.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),1);

		expr[1].next  = null;
		expr[1].op    = new AttrOperator(AttrOperator.aopGT);
		expr[1].type1 = new AttrType(AttrType.attrSymbol);

		expr[1].operand1.symbol = new FldSpec (new RelSpec(RelSpec.outer),3);
		expr[1].type2 = new AttrType(AttrType.attrInteger);
		expr[1].operand2.integer = 7;

		expr[2] = null;

		expr2[0].next  = null;
		expr2[0].op    = new AttrOperator(AttrOperator.aopEQ);
		expr2[0].type1 = new AttrType(AttrType.attrSymbol);

		expr2[0].operand1.symbol = new FldSpec (new RelSpec(RelSpec.outer),2);
		expr2[0].type2 = new AttrType(AttrType.attrSymbol);

		expr2[0].operand2.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),1);

		expr2[1].next = null;
		expr2[1].op   = new AttrOperator(AttrOperator.aopEQ);
		expr2[1].type1 = new AttrType(AttrType.attrSymbol);

		expr2[1].operand1.symbol = new FldSpec (new RelSpec(RelSpec.innerRel),3);
		expr2[1].type2 = new AttrType(AttrType.attrString);
		expr2[1].operand2.string = "red";

		expr2[2] = null;
	}

	public void Query1() {

		System.out.print("**********************Query1 strating *********************\n");
		boolean status = OK;

		// Sailors, Boats, Reserves Queries.
		System.out.print ("Query: Find the names of sailors who have reserved "
				+ "boat number 1.\n"
				+ "       and print out the date of reservation.\n\n"
				+ "  SELECT S.sname, R.date\n"
				+ "  FROM   Sailors S, Reserves R\n"
				+ "  WHERE  S.sid = R.sid AND R.bid = 1\n\n");

		System.out.print ("\n(Tests FileScan, Projection, and Sort-Merge Join)\n");

		CondExpr[] outFilter = new CondExpr[3];
		outFilter[0] = new CondExpr();
		outFilter[1] = new CondExpr();
		outFilter[2] = new CondExpr();

		Query1_CondExpr(outFilter);

		Tuple t = new Tuple();

		AttrType [] Stypes = new AttrType[4];
		Stypes[0] = new AttrType (AttrType.attrInteger);
		Stypes[1] = new AttrType (AttrType.attrString);
		Stypes[2] = new AttrType (AttrType.attrInteger);
		Stypes[3] = new AttrType (AttrType.attrReal);

		//SOS
		short [] Ssizes = new short[1];
		Ssizes[0] = 30; //first elt. is 30

		FldSpec [] Sprojection = new FldSpec[4];
		Sprojection[0] = new FldSpec(new RelSpec(RelSpec.outer), 1);
		Sprojection[1] = new FldSpec(new RelSpec(RelSpec.outer), 2);
		Sprojection[2] = new FldSpec(new RelSpec(RelSpec.outer), 3);
		Sprojection[3] = new FldSpec(new RelSpec(RelSpec.outer), 4);

		CondExpr [] selects = new CondExpr [1];
		selects = null;


		FileScan am = null;
		try {
			am  = new FileScan("sailors.in", Stypes, Ssizes, 
					(short)4, (short)4,
					Sprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for sailors");
			Runtime.getRuntime().exit(1);
		}

		AttrType [] Rtypes = new AttrType[3];
		Rtypes[0] = new AttrType (AttrType.attrInteger);
		Rtypes[1] = new AttrType (AttrType.attrInteger);
		Rtypes[2] = new AttrType (AttrType.attrString);

		short [] Rsizes = new short[1];
		Rsizes[0] = 15; 
		FldSpec [] Rprojection = new FldSpec[3];
		Rprojection[0] = new FldSpec(new RelSpec(RelSpec.outer), 1);
		Rprojection[1] = new FldSpec(new RelSpec(RelSpec.outer), 2);
		Rprojection[2] = new FldSpec(new RelSpec(RelSpec.outer), 3);

		FileScan am2 = null;
		try {
			am2 = new FileScan("reserves.in", Rtypes, Rsizes, 
					(short)3, (short) 3,
					Rprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for reserves");
			Runtime.getRuntime().exit(1);
		}


		FldSpec [] proj_list = new FldSpec[2];
		proj_list[0] = new FldSpec(new RelSpec(RelSpec.outer), 2);
		proj_list[1] = new FldSpec(new RelSpec(RelSpec.innerRel), 3);

		AttrType [] jtype = new AttrType[2];
		jtype[0] = new AttrType (AttrType.attrString);
		jtype[1] = new AttrType (AttrType.attrString);

		TupleOrder ascending = new TupleOrder(TupleOrder.Ascending);
		SortMerge sm = null;
		try {
			sm = new SortMerge(Stypes, 4, Ssizes,
					Rtypes, 3, Rsizes,
					1, 4, 
					1, 4, 
					10,
					am, am2, 
					false, false, ascending,
					outFilter, proj_list, 2);
		}
		catch (Exception e) {
			System.err.println("*** join error in SortMerge constructor ***"); 
			status = FAIL;
			System.err.println (""+e);
			e.printStackTrace();
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error constructing SortMerge");
			Runtime.getRuntime().exit(1);
		}



		QueryCheck qcheck1 = new QueryCheck(1);


		t = null;

		try {
			while ((t = sm.get_next()) != null) {
				t.print(jtype);

				qcheck1.Check(t);
			}
		}
		catch (Exception e) {
			System.err.println (""+e);
			e.printStackTrace();
			status = FAIL;
		}
		if (status != OK) {
			//bail out
			System.err.println ("*** Error in get next tuple ");
			Runtime.getRuntime().exit(1);
		}

		qcheck1.report(1);
		try {
			sm.close();
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}
		System.out.println ("\n"); 
		if (status != OK) {
			//bail out
			System.err.println ("*** Error in closing ");
			Runtime.getRuntime().exit(1);
		}
	}

	public void Query2() {
		System.out.print("**********************Query2 strating *********************\n");
		boolean status = OK;

		// Sailors, Boats, Reserves Queries.
		System.out.print 
		("Query: Find the names of sailors who have reserved "
				+ "a red boat\n"
				+ "       and return them in alphabetical order.\n\n"
				+ "  SELECT   S.sname\n"
				+ "  FROM     Sailors S, Boats B, Reserves R\n"
				+ "  WHERE    S.sid = R.sid AND R.bid = B.bid AND B.color = 'red'\n"
				+ "  ORDER BY S.sname\n"
				+ "Plan used:\n"
				+ " Sort (Pi(sname) (Sigma(B.color='red')  "
				+ "|><|  Pi(sname, bid) (S  |><|  R)))\n\n"
				+ "(Tests File scan, Index scan ,Projection,  index selection,\n "
				+ "sort and simple nested-loop join.)\n\n");

		// Build Index first
		IndexType b_index = new IndexType (IndexType.B_Index);


		//ExtendedSystemDefs.MINIBASE_CATALOGPTR.addIndex("sailors.in", "sid", b_index, 1);
		// }
		//catch (Exception e) {
		// e.printStackTrace();
		// System.err.print ("Failure to add index.\n");
		//  Runtime.getRuntime().exit(1);
		// }




		CondExpr [] outFilter  = new CondExpr[2];
		outFilter[0] = new CondExpr();
		outFilter[1] = new CondExpr();

		CondExpr [] outFilter2 = new CondExpr[3];
		outFilter2[0] = new CondExpr();
		outFilter2[1] = new CondExpr();
		outFilter2[2] = new CondExpr();

		Query2_CondExpr(outFilter, outFilter2);
		Tuple t = new Tuple();
		t = null;

		AttrType [] Stypes = {
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrString), 
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrReal)
		};

		AttrType [] Stypes2 = {
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrString), 
		};

		short []   Ssizes = new short[1];
		Ssizes[0] = 30;
		AttrType [] Rtypes = {
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrString), 
		};

		short  []  Rsizes = new short[1] ;
		Rsizes[0] = 15;
		AttrType [] Btypes = {
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrString), 
				new AttrType(AttrType.attrString), 
		};

		short  []  Bsizes = new short[2];
		Bsizes[0] =30;
		Bsizes[1] =20;
		AttrType [] Jtypes = {
				new AttrType(AttrType.attrString), 
				new AttrType(AttrType.attrInteger), 
		};

		short  []  Jsizes = new short[1];
		Jsizes[0] = 30;
		AttrType [] JJtype = {
				new AttrType(AttrType.attrString), 
		};

		short [] JJsize = new short[1];
		JJsize[0] = 30;
		FldSpec []  proj1 = {
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.innerRel), 2)
		}; // S.sname, R.bid

		FldSpec [] proj2  = {
				new FldSpec(new RelSpec(RelSpec.outer), 1)
		};

		FldSpec [] Sprojection = {
				new FldSpec(new RelSpec(RelSpec.outer), 1),
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				// new FldSpec(new RelSpec(RelSpec.outer), 3),
				// new FldSpec(new RelSpec(RelSpec.outer), 4)
		};

		CondExpr [] selects = new CondExpr[1];
		selects[0] = null;


		//IndexType b_index = new IndexType(IndexType.B_Index);
		iterator.Iterator am = null;


		//_______________________________________________________________
		//*******************create an scan on the heapfile**************
		//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
		// create a tuple of appropriate size
		Tuple tt = new Tuple();
		try {
			tt.setHdr((short) 4, Stypes, Ssizes);
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}

		int sizett = tt.size();
		tt = new Tuple(sizett);
		try {
			tt.setHdr((short) 4, Stypes, Ssizes);
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}
		Heapfile        f = null;
		try {
			f = new Heapfile("sailors.in");
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}

		Scan scan = null;

		try {
			scan = new Scan(f);
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
			Runtime.getRuntime().exit(1);
		}

		// create the index file
		BTreeFile btf = null;
		try {
			btf = new BTreeFile("BTreeIndex", AttrType.attrInteger, 4, 1); 
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
			Runtime.getRuntime().exit(1);
		}

		RID rid = new RID();
		int key =0;
		Tuple temp = null;

		try {
			temp = scan.getNext(rid);
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}
		while ( temp != null) {
			tt.tupleCopy(temp);

			try {
				key = tt.getIntFld(1);
			}
			catch (Exception e) {
				status = FAIL;
				e.printStackTrace();
			}

			try {
				btf.insert(new IntegerKey(key), rid); 
			}
			catch (Exception e) {
				status = FAIL;
				e.printStackTrace();
			}

			try {
				temp = scan.getNext(rid);
			}
			catch (Exception e) {
				status = FAIL;
				e.printStackTrace();
			}
		}

		// close the file scan
		scan.closescan();


		//_______________________________________________________________
		//*******************close an scan on the heapfile**************
		//++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

		System.out.print ("After Building btree index on sailors.sid.\n\n");
		try {
			am = new IndexScan ( b_index, "sailors.in",
					"BTreeIndex", Stypes, Ssizes, 4, 2,
					Sprojection, null, 1, false);
		}

		catch (Exception e) {
			System.err.println ("*** Error creating scan for Index scan");
			System.err.println (""+e);
			Runtime.getRuntime().exit(1);
		}


		NestedLoopsJoins nlj = null;
		try {
			nlj = new NestedLoopsJoins (Stypes2, 2, Ssizes,
					Rtypes, 3, Rsizes,
					10,
					am, "reserves.in",
					outFilter, null, proj1, 2);
		}
		catch (Exception e) {
			System.err.println ("*** Error preparing for nested_loop_join");
			System.err.println (""+e);
			e.printStackTrace();
			Runtime.getRuntime().exit(1);
		}

		NestedLoopsJoins nlj2 = null ; 
		try {
			nlj2 = new NestedLoopsJoins (Jtypes, 2, Jsizes,
					Btypes, 3, Bsizes,
					10,
					nlj, "boats.in",
					outFilter2, null, proj2, 1);
		}
		catch (Exception e) {
			System.err.println ("*** Error preparing for nested_loop_join");
			System.err.println (""+e);
			Runtime.getRuntime().exit(1);
		}

		TupleOrder ascending = new TupleOrder(TupleOrder.Ascending);
		Sort sort_names = null;
		try {
			sort_names = new Sort (JJtype,(short)1, JJsize,
					(iterator.Iterator) nlj2, 1, ascending, JJsize[0], 10);
		}
		catch (Exception e) {
			System.err.println ("*** Error preparing for nested_loop_join");
			System.err.println (""+e);
			Runtime.getRuntime().exit(1);
		}


		QueryCheck qcheck2 = new QueryCheck(2);


		t = null;
		try {
			while ((t = sort_names.get_next()) != null) {
				t.print(JJtype);
				qcheck2.Check(t);
			}
		}
		catch (Exception e) {
			System.err.println (""+e);
			e.printStackTrace();
			Runtime.getRuntime().exit(1);
		}

		qcheck2.report(2);

		System.out.println ("\n"); 
		try {
			sort_names.close();
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}

		if (status != OK) {
			//bail out

			Runtime.getRuntime().exit(1);
		}
	}


	public void Query3() {
		System.out.print("**********************Query3 strating *********************\n"); 
		boolean status = OK;

		// Sailors, Boats, Reserves Queries.

		System.out.print 
		( "Query: Find the names of sailors who have reserved a boat.\n\n"
				+ "  SELECT S.sname\n"
				+ "  FROM   Sailors S, Reserves R\n"
				+ "  WHERE  S.sid = R.sid\n\n"
				+ "(Tests FileScan, Projection, and SortMerge Join.)\n\n");

		CondExpr [] outFilter = new CondExpr[2];
		outFilter[0] = new CondExpr();
		outFilter[1] = new CondExpr();

		Query3_CondExpr(outFilter);

		Tuple t = new Tuple();
		t = null;

		AttrType Stypes[] = {
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrString),
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrReal)
		};
		short []   Ssizes = new short[1];
		Ssizes[0] = 30;

		AttrType [] Rtypes = {
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrString),
		};
		short  []  Rsizes = new short[1];
		Rsizes[0] =15;

		FldSpec [] Sprojection = {
				new FldSpec(new RelSpec(RelSpec.outer), 1),
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.outer), 3),
				new FldSpec(new RelSpec(RelSpec.outer), 4)
		};

		CondExpr[] selects = new CondExpr [1];
		selects = null;

		iterator.Iterator am = null;
		try {
			am  = new FileScan("sailors.in", Stypes, Ssizes,
					(short)4, (short) 4,
					Sprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for sailors");
			Runtime.getRuntime().exit(1);
		}

		FldSpec [] Rprojection = {
				new FldSpec(new RelSpec(RelSpec.outer), 1),
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.outer), 3)
		}; 

		iterator.Iterator am2 = null;
		try {
			am2 = new FileScan("reserves.in", Rtypes, Rsizes, 
					(short)3, (short)3,
					Rprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for reserves");
			Runtime.getRuntime().exit(1);
		}

		FldSpec [] proj_list = {
				new FldSpec(new RelSpec(RelSpec.outer), 2)
		};

		AttrType [] jtype     = { new AttrType(AttrType.attrString) };

		TupleOrder ascending = new TupleOrder(TupleOrder.Ascending);
		SortMerge sm = null;
		try {
			sm = new SortMerge(Stypes, 4, Ssizes,
					Rtypes, 3, Rsizes,
					1, 4,
					1, 4,
					10,
					am, am2,
					false, false, ascending,
					outFilter, proj_list, 1);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error constructing SortMerge");
			Runtime.getRuntime().exit(1);
		}

		QueryCheck qcheck3 = new QueryCheck(3);


		t = null;

		try {
			while ((t = sm.get_next()) != null) {
				t.print(jtype);
				qcheck3.Check(t);
			}
		}
		catch (Exception e) {
			System.err.println (""+e);
			e.printStackTrace();
			Runtime.getRuntime().exit(1);
		}


		qcheck3.report(3);

		System.out.println ("\n"); 
		try {
			sm.close();
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for sailors");
			Runtime.getRuntime().exit(1);
		}
	}

	public void Query4() {
		System.out.print("**********************Query4 strating *********************\n");
		boolean status = OK;

		// Sailors, Boats, Reserves Queries.

		System.out.print 
		("Query: Find the names of sailors who have reserved a boat\n"
				+ "       and print each name once.\n\n"
				+ "  SELECT DISTINCT S.sname\n"
				+ "  FROM   Sailors S, Reserves R\n"
				+ "  WHERE  S.sid = R.sid\n\n"
				+ "(Tests FileScan, Projection, Sort-Merge Join and "
				+ "Duplication elimination.)\n\n");

		CondExpr [] outFilter = new CondExpr[2];
		outFilter[0] = new CondExpr();
		outFilter[1] = new CondExpr();

		Query3_CondExpr(outFilter);

		Tuple t = new Tuple();
		t = null;

		AttrType Stypes[] = {
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrString),
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrReal)
		};
		short []   Ssizes = new short[1];
		Ssizes[0] = 30;

		AttrType [] Rtypes = {
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrString),
		};
		short  []  Rsizes = new short[1];
		Rsizes[0] =15;

		FldSpec [] Sprojection = {
				new FldSpec(new RelSpec(RelSpec.outer), 1),
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.outer), 3),
				new FldSpec(new RelSpec(RelSpec.outer), 4)
		};

		CondExpr[] selects = new CondExpr [1];
		selects = null;

		iterator.Iterator am = null;
		try {
			am  = new FileScan("sailors.in", Stypes, Ssizes,
					(short)4, (short) 4,
					Sprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for sailors");
			Runtime.getRuntime().exit(1);
		}

		FldSpec [] Rprojection = {
				new FldSpec(new RelSpec(RelSpec.outer), 1),
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.outer), 3)
		}; 

		iterator.Iterator am2 = null;
		try {
			am2 = new FileScan("reserves.in", Rtypes, Rsizes, 
					(short)3, (short)3,
					Rprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for reserves");
			Runtime.getRuntime().exit(1);
		}

		FldSpec [] proj_list = {
				new FldSpec(new RelSpec(RelSpec.outer), 2)
		};

		AttrType [] jtype     = { new AttrType(AttrType.attrString) };

		TupleOrder ascending = new TupleOrder(TupleOrder.Ascending);
		SortMerge sm = null;
		short  []  jsizes    = new short[1];
		jsizes[0] = 30;
		try {
			sm = new SortMerge(Stypes, 4, Ssizes,
					Rtypes, 3, Rsizes,
					1, 4,
					1, 4,
					10,
					am, am2,
					false, false, ascending,
					outFilter, proj_list, 1);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error constructing SortMerge");
			Runtime.getRuntime().exit(1);
		}



		DuplElim ed = null;
		try {
			ed = new DuplElim(jtype, (short)1, jsizes, sm, 10, false);
		}
		catch (Exception e) {
			System.err.println (""+e);
			Runtime.getRuntime().exit(1);
		}

		QueryCheck qcheck4 = new QueryCheck(4);


		t = null;

		try {
			while ((t = ed.get_next()) != null) {
				t.print(jtype);
				qcheck4.Check(t);
			}
		}
		catch (Exception e) {
			System.err.println (""+e);
			e.printStackTrace(); 
			Runtime.getRuntime().exit(1);
		}

		qcheck4.report(4);
		try {
			ed.close();
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}
		System.out.println ("\n");  
		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for sailors");
			Runtime.getRuntime().exit(1);
		}
	}

	public void Query5() {
		System.out.print("**********************Query5 strating *********************\n");  
		boolean status = OK;
		// Sailors, Boats, Reserves Queries.

		System.out.print 
		("Query: Find the names of old sailors or sailors with "
				+ "a rating less\n       than 7, who have reserved a boat, "
				+ "(perhaps to increase the\n       amount they have to "
				+ "pay to make a reservation).\n\n"
				+ "  SELECT S.sname, S.rating, S.age\n"
				+ "  FROM   Sailors S, Reserves R\n"
				+ "  WHERE  S.sid = R.sid and (S.age > 40 || S.rating < 7)\n\n"
				+ "(Tests FileScan, Multiple Selection, Projection, "
				+ "and Sort-Merge Join.)\n\n");


		CondExpr [] outFilter;
		outFilter = Query5_CondExpr();

		Tuple t = new Tuple();
		t = null;

		AttrType Stypes[] = {
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrString),
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrReal)
		};
		short []   Ssizes = new short[1];
		Ssizes[0] = 30;

		AttrType [] Rtypes = {
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrInteger),
				new AttrType(AttrType.attrString),
		};
		short  []  Rsizes = new short[1];
		Rsizes[0] = 15;

		FldSpec [] Sprojection = {
				new FldSpec(new RelSpec(RelSpec.outer), 1),
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.outer), 3),
				new FldSpec(new RelSpec(RelSpec.outer), 4)
		};

		CondExpr[] selects = new CondExpr [1];
		selects[0] = null;

		FldSpec [] proj_list = {
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.outer), 3),
				new FldSpec(new RelSpec(RelSpec.outer), 4)
		};

		FldSpec [] Rprojection = {
				new FldSpec(new RelSpec(RelSpec.outer), 1),
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.outer), 3)
		};

		AttrType [] jtype     = { 
				new AttrType(AttrType.attrString), 
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrReal)
		};


		iterator.Iterator am = null;
		try {
			am  = new FileScan("sailors.in", Stypes, Ssizes, 
					(short)4, (short)4,
					Sprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for sailors");
			Runtime.getRuntime().exit(1);
		}

		iterator.Iterator am2 = null;
		try {
			am2 = new FileScan("reserves.in", Rtypes, Rsizes, 
					(short)3, (short)3,
					Rprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error setting up scan for reserves");
			Runtime.getRuntime().exit(1);
		}

		TupleOrder ascending = new TupleOrder(TupleOrder.Ascending);
		SortMerge sm = null;
		try {
			sm = new SortMerge(Stypes, 4, Ssizes,
					Rtypes, 3, Rsizes,
					1, 4,
					1, 4,
					10,
					am, am2,
					false, false, ascending,
					outFilter, proj_list, 3);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
		}

		if (status != OK) {
			//bail out
			System.err.println ("*** Error constructing SortMerge");
			Runtime.getRuntime().exit(1);
		}

		QueryCheck qcheck5 = new QueryCheck(5);
		//Tuple t = new Tuple();
		t = null;

		try {
			while ((t = sm.get_next()) != null) {
				t.print(jtype);
				qcheck5.Check(t);
			}
		}
		catch (Exception e) {
			System.err.println (""+e);
			Runtime.getRuntime().exit(1);
		}

		qcheck5.report(5);
		try {
			sm.close();
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}
		System.out.println ("\n"); 
		if (status != OK) {
			//bail out
			System.err.println ("*** Error close for sortmerge");
			Runtime.getRuntime().exit(1);
		}
	}

	public void Query6()
	{
		System.out.print("**********************Query6 strating *********************\n");
		boolean status = OK;
		// Sailors, Boats, Reserves Queries.
		System.out.print( "Query: Find the names of sailors with a rating greater than 7\n"
				+ "  who have reserved a red boat, and print them out in sorted order.\n\n"
				+ "  SELECT   S.sname\n"
				+ "  FROM     Sailors S, Boats B, Reserves R\n"
				+ "  WHERE    S.sid = R.sid AND S.rating > 7 AND R.bid = B.bid \n"
				+ "           AND B.color = 'red'\n"
				+ "  ORDER BY S.name\n\n"

			+ "Plan used:\n"
			+" Sort(Pi(sname) (Sigma(B.color='red')  |><|  Pi(sname, bid) (Sigma(S.rating > 7)  |><|  R)))\n\n"

			+ "(Tests FileScan, Multiple Selection, Projection,sort and nested-loop join.)\n\n");

		CondExpr [] outFilter  = new CondExpr[3];
		outFilter[0] = new CondExpr();
		outFilter[1] = new CondExpr();
		outFilter[2] = new CondExpr();
		CondExpr [] outFilter2 = new CondExpr[3];
		outFilter2[0] = new CondExpr();
		outFilter2[1] = new CondExpr();
		outFilter2[2] = new CondExpr();

		Query6_CondExpr(outFilter, outFilter2);
		Tuple t = new Tuple();
		t = null;

		AttrType [] Stypes = {
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrString), 
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrReal)
		};



		short []   Ssizes = new short[1];
		Ssizes[0] = 30;
		AttrType [] Rtypes = {
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrString), 
		};

		short  []  Rsizes = new short[1] ;
		Rsizes[0] = 15;
		AttrType [] Btypes = {
				new AttrType(AttrType.attrInteger), 
				new AttrType(AttrType.attrString), 
				new AttrType(AttrType.attrString), 
		};

		short  []  Bsizes = new short[2];
		Bsizes[0] =30;
		Bsizes[1] =20;


		AttrType [] Jtypes = {
				new AttrType(AttrType.attrString), 
				new AttrType(AttrType.attrInteger), 
		};

		short  []  Jsizes = new short[1];
		Jsizes[0] = 30;
		AttrType [] JJtype = {
				new AttrType(AttrType.attrString), 
		};

		short [] JJsize = new short[1];
		JJsize[0] = 30; 



		FldSpec []  proj1 = {
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.innerRel), 2)
		}; // S.sname, R.bid

		FldSpec [] proj2  = {
				new FldSpec(new RelSpec(RelSpec.outer), 1)
		};

		FldSpec [] Sprojection = {
				new FldSpec(new RelSpec(RelSpec.outer), 1),
				new FldSpec(new RelSpec(RelSpec.outer), 2),
				new FldSpec(new RelSpec(RelSpec.outer), 3),
				new FldSpec(new RelSpec(RelSpec.outer), 4)
		};





		FileScan am = null;
		try {
			am  = new FileScan("sailors.in", Stypes, Ssizes, 
					(short)4, (short)4,
					Sprojection, null);
		}
		catch (Exception e) {
			status = FAIL;
			System.err.println (""+e);
			e.printStackTrace();
		}

		if (status != OK) {
			//bail out

			System.err.println ("*** Error setting up scan for sailors");
			Runtime.getRuntime().exit(1);
		}



		NestedLoopsJoins inl = null;
		try {
			inl = new NestedLoopsJoins (Stypes, 4, Ssizes,
					Rtypes, 3, Rsizes,
					10,
					am, "reserves.in",
					outFilter, null, proj1, 2);
		}
		catch (Exception e) {
			System.err.println ("*** Error preparing for nested_loop_join");
			System.err.println (""+e);
			e.printStackTrace();
			Runtime.getRuntime().exit(1);
		}

		System.out.print( "After nested loop join S.sid|><|R.sid.\n");

		NestedLoopsJoins nlj = null;
		try {
			nlj = new NestedLoopsJoins (Jtypes, 2, Jsizes,
					Btypes, 3, Bsizes,
					10,
					inl, "boats.in",
					outFilter2, null, proj2, 1);
		}
		catch (Exception e) {
			System.err.println ("*** Error preparing for nested_loop_join");
			System.err.println (""+e);
			e.printStackTrace();
			Runtime.getRuntime().exit(1);
		}

		System.out.print( "After nested loop join R.bid|><|B.bid AND B.color=red.\n");

		TupleOrder ascending = new TupleOrder(TupleOrder.Ascending);
		Sort sort_names = null;
		try {
			sort_names = new Sort (JJtype,(short)1, JJsize,
					(iterator.Iterator) nlj, 1, ascending, JJsize[0], 10);
		}
		catch (Exception e) {
			System.err.println ("*** Error preparing for sorting");
			System.err.println (""+e);
			Runtime.getRuntime().exit(1);
		}


		System.out.print( "After sorting the output tuples.\n");


		QueryCheck qcheck6 = new QueryCheck(6);

		try {
			while ((t =sort_names.get_next()) !=null) {
				t.print(JJtype);
				qcheck6.Check(t);
			}
		}catch (Exception e) {
			System.err.println ("*** Error preparing for get_next tuple");
			System.err.println (""+e);
			Runtime.getRuntime().exit(1);
		}

		qcheck6.report(6);

		System.out.println ("\n"); 
		try {
			sort_names.close();
		}
		catch (Exception e) {
			status = FAIL;
			e.printStackTrace();
		}

		if (status != OK) {
			//bail out

			Runtime.getRuntime().exit(1);
		}

	}


	private void Disclaimer() {
		System.out.print ("\n\nAny resemblance of persons in this database to"
				+ " people living or dead\nis purely coincidental. The contents of "
				+ "this database do not reflect\nthe views of the University,"
				+ " the Computer  Sciences Department or the\n"
				+ "developers...\n\n");
	}
}

public class JoinTest
{
	public static void main(String argv[])
	{
		boolean sortstatus;
		//SystemDefs global = new SystemDefs("bingjiedb", 100, 70, null);
		//JavabaseDB.openDB("/tmp/nwangdb", 5000);

		JoinsDriver jjoin = new JoinsDriver();

		sortstatus = jjoin.runTests();
		if (sortstatus != true) {
			System.out.println("Error ocurred during join tests");
		}
		else {
			System.out.println("join tests completed successfully");
		}
	}
}

